package ar.republicagroup.gestion.dao.jpa;

import ar.republicagroup.gestion.dao.CajaDAO;
import ar.republicagroup.gestion.entities.Caja;
import ar.republicagroup.gestion.entities.MovimientoTipo;
import ar.republicagroup.gestion.util.JPAUtil;
import ar.republicagroup.gestion.util.UserSession;
import ar.republicagroup.gestion.util.helpers.Formato;
import ar.republicagroup.gestion.util.messages.UIMessages;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.apache.log4j.Logger;

/**
 *
 * @author DIEGOALV
 */
public class CajaDAOImplJPA implements CajaDAO {
    
    private EntityManager		 em;
    private Logger log = Logger.getLogger(CajaDAOImplJPA.class);

    public CajaDAOImplJPA(){
        em = JPAUtil.getEntityManager();
    }
    
    @Override
    public String insert(Caja beanCaja) {
                
                if(!em.isOpen()){ em = JPAUtil.getEntityManager(); } 
                String resultado = null;
		
                try
                {
			em.getTransaction().begin();
			em.persist(beanCaja);
			em.getTransaction().commit();
			resultado = "Registrando en caja...";
                        log.info(UserSession.getInstance().getUser_name()+"("+UserSession.getInstance().getUser_id()+")" 
                                + "---> Registrando : "+beanCaja.getMovimientoTipoId().getNombre()+ " / " + "Importe :"+beanCaja.getImporte());
		}catch(Exception ex){
			em.getTransaction().rollback();
			log.error("Error al registrar movimiento en caja...", ex);
			
		}
	
		return resultado;
    }

    @Override
    public String update(Caja beanCaja) {
        
            String mensaje = null;
            
            try {    
                    em.getTransaction().begin();
                    em.merge(beanCaja);
                    em.getTransaction().commit();
                    mensaje = UIMessages.getInfoMessage("onCompleteUpdate");
                    
                    if( beanCaja.getEstado() == 0){
                        log.info("("+UserSession.getInstance().getUser_name()+") "+", eliminando movimiento en caja -> id : "+beanCaja.getId()+" / "+Formato.decimalComaMilesConSigno(beanCaja.getImporte().doubleValue())+" ("+beanCaja.getMovimientoTipoId().getNombre()+")" );
                    } else {
                        log.info(UIMessages.getInfoMessage("onCompleteUpdate"));
                    }
                    
                }catch(Exception ex){
                    em.getTransaction().rollback();
                    log.error("Error al actualizar cheque...",ex);
                }
                
                return mensaje;
    }

    @Override
    public Caja get(Integer idcaja) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String delete(Integer idcaja) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public List<Caja> getMovimientosCajaByFecha(Calendar fechaCaja) {
        
            CriteriaBuilder qb              = em.getCriteriaBuilder();
            CriteriaQuery cq                = qb.createQuery();
            Root<Caja> caja                 = cq.from(Caja.class);
            List<Predicate> predicates      = new ArrayList<>();
            
            
            if(fechaCaja != null){
                Date fechaInicio = fechaCaja.getTime();
                fechaInicio.setHours(0);
                fechaInicio.setMinutes(0);
                fechaInicio.setSeconds(0);
                
                Date fechaFin    = fechaCaja.getTime();
                fechaFin.setHours(23);
                fechaFin.setMinutes(59);
                fechaFin.setSeconds(59);
                predicates.add( qb.between( caja.get("fecha").as(Date.class), fechaInicio, fechaFin ) );
            }
            
            predicates.add(qb.equal(caja.get("estado"), 1));
            cq.select(caja).where(predicates.toArray(new Predicate[]{}));
            cq.orderBy(qb.desc(caja.get("fecha").as(Date.class)));
            List<Caja> resultList = em.createQuery(cq).getResultList();
            return resultList;
            
    }
    
    
    
}
